package com.mt.mtyx.common.utils.generate.context;

import com.mt.mtyx.common.utils.JsonPage;
import com.mt.mtyx.common.utils.generate.generate.code.GenerateCondition;
import com.mt.mtyx.common.utils.generate.generate.code.GenerateMethod;
import com.mt.mtyx.common.utils.generate.generate.code.GenerateType;
import com.mt.mtyx.common.utils.generate.generate.config.OtherCodeConfig;
import java.sql.Timestamp;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author WMT
 * @Date 2023/5/26 17:27
 */
public class FastGenerateCode {

    public static void main(String[] args) {
        FastAutoGenerateCode
                .create("root",
                        "root",
                        "jdbc:mysql:///grtaps",
                        "com.mysql.cj.jdbc.Driver")
                .consumer(data -> {
                    // mapper方法配置
                    Map<String, GenerateMethod> mapperMethod = data.getMapper().getMethod();
                    List<String> select = Arrays.asList("COUNT", "LIST");
                    List<String> update = Arrays.asList("DELETE", "UPDATE", "ONE");
                    for (Map.Entry<String, GenerateMethod> entry : mapperMethod.entrySet()) {
                        if (select.contains(entry.getKey())) {
                            GenerateMethod generateMethod = entry.getValue();
                            List<GenerateType> param = generateMethod.getParam();
                            List<GenerateCondition> list = new LinkedList<>();
                            list.add(new GenerateCondition("username", "username", "LIKE", GenerateCondition.WHERE));
                            list.add(new GenerateCondition("id", "id", "=", GenerateCondition.WHERE));
                            if ("LIST".equals(entry.getKey())) {
                                list.add(new GenerateCondition("username", GenerateCondition.ORDER, true));
                                list.add(new GenerateCondition("offSize", "pageSize", GenerateCondition.LIMIT));
                            }
                            param.get(0).setValue(list.stream().collect(Collectors.groupingBy(GenerateCondition::getType)));
                        }
                        if (update.contains(entry.getKey())) {
                            GenerateMethod generateMethod = entry.getValue();
                            List<GenerateType> param = generateMethod.getParam();
                            List<GenerateCondition> list = new LinkedList<>();
                            list.add(new GenerateCondition("id", "id", "=", GenerateCondition.WHERE));
                            param.get(0).setValue(list.stream().collect(Collectors.groupingBy(GenerateCondition::getType)));
                        }
                    }

                    // service方法配置
                    Map<String, GenerateMethod> serviceMethod = data.getService().getMethod();
                    for (Map.Entry<String, GenerateMethod> entry : serviceMethod.entrySet()) {
                        if (select.contains(entry.getKey())) {
                            GenerateMethod generateMethod = entry.getValue();
                            List<GenerateType> param = generateMethod.getParam();
                            param.add(new GenerateType<>("Integer", null, "当前页数", "int", null, "page"));
                            param.add(new GenerateType<>("Integer", null, "每页大小", "int", null, "size"));
                        }
                    }
                    Map<String, GenerateMethod> controllerMethod = data.getController().getMethod();
                    for (Map.Entry<String, GenerateMethod> entry : controllerMethod.entrySet()) {
                        if (select.contains(entry.getKey())) {
                            GenerateMethod generateMethod = entry.getValue();
                            List<GenerateType> param = generateMethod.getParam();
                            param.add(new GenerateType<>("Integer", null, "当前页数", "int", null, "page"));
                            param.add(new GenerateType<>("Integer", null, "每页大小", "int", null, "size"));
                        }
                    }
                })
                .datasource(builder -> {
                    builder
                            .addIncludeTable("dire_device_info", "admin") //包含的表
//                            .addExcludeTable("ed_training_record", "admin") //排除的表
                            .addPrefixTable("dire") // 前缀
//                            .addSuffixTable("record") // 后缀
//                            .addTypeMap(Collections.emptyMap()) // 增加类型隐射
                            .addTypeMap(Collections.singletonMap("timestamp", Timestamp.class)); //添加mysql字段类型与java类型隐射
//                            .setFieldSuffixAlphabet("F"); // 字段公共前缀 （为了满足驼峰命名规则）
                })
                .global(builder -> {
                    builder
                            .outDir("D:\\Filed") // 输出目录
                            .openOverride(true) // 是否覆盖源文件
                            .openOutDir(true) // 是否自动打开输出目录
                            .jsonPageCLass(JsonPage.class) // 分页类
                            .author("WMT") // 作者
//                            .format("yyyy-MM-dd") // 日期格式 注释
                            .mybatis(true) // 是否开启mybatis
                            .enableSwagger(true) // 是否开启swagger
                            .enableGenerateDll(true) // 是否生成增删改查方法
                            .generateConfig((data) -> {
//                                data.put("serviceImpl", false); // 不生成 serviceImpl 模板
//                                data.put("other", false); // 不生产 other 模板
                            }) // 指定生成文件模板 默认全生成
                    ;
                })
                .packing(builder -> {
                    builder
                            .basePackage("mt.common") // 公共包名
                            .entity("model.entity") // 实体包名 .表示下一级补录
//                            .mapper("mapper") // mapper包名
//                            .mapperXml("mapper") // xml包名
//                            .service("service") // service包名
//                            .serviceImpl("service.impl") // serviceImpl包名
//                            .controller("controller") // controller 目录
//                            .separator(CaseFormat.UPPER_UNDERSCORE) // 分隔符策略 下划线首字母大写
//                            .format(CaseFormat.UPPER_CAMEL) // 文件策略 驼峰命名
//                            .tablePrefixConvert(Collections.singletonMap("ed", "")) // 前缀名称转换 【将ed转为空字符串】
//                            .tableSuffixConvert(Collections.singletonMap("record", "tip")); // 后缀名称转换 【将record转为tip】
                    ;
                })
                .entity(builder -> {
                    builder
                            .enableToString(false) // 是否开启toString
                            .enableLombok(false) // 是否开启lombok
                            .enableSerialVersionUID(false) // 是否开启序列化
                            .ignoredSupperField(false) // 是否忽略父类属性
                            .enableTableFieldAnnotation(true) // 是否开启表格注解
                            .entityFormat("%s") // entity实体格式 默认为%sEntity
//                            .entityName("AmmoDirectoryExtend") // 实体名称
//                            .setSupperCLass("eteam.aps.common.entity.ParentEntity") // 父类
//                            .supperCLass(ParentEntity.class)
//                            .importPackage(Collections.emptySet()) // 导包
                    ;
                })
                .mapper(builder -> {
                    builder
//                            .mapperName("") // mapper名称
//                            .mapperXmlName("") // mapperXml名称
//                            .mapperFormat("%sMapper") // mapper格式转换 默认
//                            .mapperXmlFormat("%sMapper") // mapperXml格式 默认
                            .enableFieldMapper(true) // 是否生成xml sql字段
                            .enableMapperPlus(false) // 是否开启Mybatis-Plus
                            .enableMapper(true) // 是否开启Mapper注解
//                            .supperCLass("") // mapper父类
//                            .importPackage(Collections.emptySet()) // 导包
//                            .methodMap((data)->{}) // 自定义Mapper方法 为null则不会生成
                    ;
                })
                .service(builder -> {
                    builder
//                            .serviceName("") // service名称
//                            .serviceImpl("") // serviceImpl名称
//                            .serviceFormat("%sService") // service格式 默认
//                            .serviceImplFormat("%sServiceImpl") // serviceImpl 格式 默认
//                            .serviceSupperClass("") // service父类
//                            .serviceImplSupperClass("") // serviceImpl实现类父类
//                            .importServicePackage(Collections.emptySet()) // service导包
//                            .importServiceImplPackage(Collections.emptySet()) // serviceImpl导包
                            .enableMybatisPlus(false) // 是否开启mybatis-plus
                            .enableComponent(true) // 是否开启注入容器
                            .methodMap((data) -> {
                            }) // 自定义service方法 为null则不会生成
                    ;
                })
                .controller(build -> {
                    build
                            .controllerName("") // controller名称
                            .controllerFormat("%sController") // controller格式
                            .supperClass("") // controller 父类
                            .enableRestController(true) // 是否开启RestController风格
                            .importPackage(Collections.emptySet()) // controller导包
                            .methodMap((data) -> {
                                data.put("ONE", null);
                            }) // 自定义controller方法 为null则不会生成
                    ;
                })
                .other(() -> {
                    List<OtherCodeConfig> list = new LinkedList<>();
                    OtherCodeConfig o1 = new OtherCodeConfig()
                            .enableLombok(false)
                            .other("vo")
                            .otherPack("model.vo")
                            .template("/templates/vo.java.vm")
                            .otherFormat("%sVo")
                            .enableToString(true)
                            .ignoredSupperField(true);
                    list.add(o1);
                    return list;
                })
                .execute().open();
    }

}
